#用户密码复杂度验证
#长度超过8位
def length(passwd):
    if len(passwd) <= 8:
        return False
    return True
#包括大、小写字母，数字，其他符号，以上四种至少三种
def complex(passwd):
    alpha = 0
    num = 0
    special = 0
    for i in passwd:
        if i.isalpha():
            alpha = 1
        elif i.isdigit():
            num = 1
        else:
            special = 1
        if alpha + num + special == 3:
            return True
    return False
#不能有长度超过或等于3的子串重复
def pd_repeat(passwd):
    #方法一：
    # for i in range(len(passwd)):
    #     passwd2 = passwd[i+1:]
    #     for j in range(len(passwd2)):
    #         if passwd[i] == passwd2[j]:
    #             if passwd2[j+1] == passwd[i+1]:
    #                 if passwd2[j + 2] == passwd[i + 2]:
    #                     return False
    # return True
    #方法二：
    # length = 0
    # while length <= len(passwd)-2:
    #     if passwd.count(passwd[length:length+3]) > 1:
    #         return False
    #     length += 1
    # return True
    #方法三：
    while len(passwd) >= 6:
        if passwd.count(passwd[0:3]) > 1:
            return False
        passwd = passwd[1:]
    return True
#判断函数
def passwd_pd(passwd):
    count = 2
    str_lst = []
    if length(passwd):
        count += 1
    else:
        str_lst.append("长度小于8")
    if complex(passwd):
        count += 1
    else:
        str_lst.append("密码没有由3种以上字符组成")
    if pd_repeat(passwd):
        count += 1
    else:
        str_lst.append("不能有长度超过或等于3的子串重复")
    if count != 5:
        print(f"密码评分等级为{count},要改进的点有{str_lst}")
    else:
        print(f"密码评分等级为{count}")
    return count
# password = input("please input a password:")
# passwd_pd(password)

#写一个三乐购物系统，功能使用函数封装
#1、欢迎界面
#   1.登录
#       输入用户名和密码
#       和系统里保存的用户信息比较，判断用户和密码是否合法
#       登录失败，返回上一级
#       登录成功
#           1.查看商品
#           2.加入购物车
#           3.结算购物车
#           4.返回是一级
#   2.注册
#       用户名、用户密码、用户存入金额
#       用户信息固化
#   3.退出

import json, os
#用户注册函数
def regist():
    file_path = "user_info.json"
    user_info = {}
    #判断文件是否存在
    if os.path.exists(file_path):
        #文件存在，读出文件内容放入user_info字典中保存
        fp = open(file_path)
        name_str = fp.read()
        user_info = json.loads(name_str)
    username = input("请输入用户名：")
    #判断用户名是否在user_info中存在
    for i in user_info:
        if i == username:
            print("用户名已存在！")
            return False
    password = input("请输入密码：")
    #判断密码复杂性
    grade = passwd_pd(password)
    if grade != 5:
        print("注册失败！")
        return False
    tot_money = input("请输入存入金额：")
    #判断存入金额是否是一个数字
    if not tot_money.isdigit():
        print("您输入的不是一个数字！")
        return False
    #如果上面步骤都成功，保存用户信息
    user_info[username] = {"password": password, "tot_money": int(tot_money)}
    #用户信息固化
    fp = open("user_info.json", "w")
    result_str = json.dumps(user_info)
    fp.write(result_str)
    fp.flush()
    print("注册成功！")
    return True

def login():
    file_path = "user_info.json"
    user_info = {}
    # 判断文件是否存在
    if os.path.exists(file_path):
        # 文件存在，读出文件内容放入user_info字典中保存
        fp = open(file_path)
        name_str = fp.read()
        user_info = json.loads(name_str)
    username = input("请输入用户名：")
    password = input("请输入密码：")
    #判断用户名是否存在
    if username in user_info:
        #如果用户名存在，判断密码是否正确
        if password == user_info[username]["password"]:
            print("登录成功！")
            shopping(username, user_info)
            return True
        else:
            print("密码错误！登录失败！")
            return False
    else:
        print("用户名错误或不存在！登录失败！")
        return False

def shopping(username,user_info):
    print("欢迎你进入三乐购物系统！")
    print("你可以按：\n1.查看商品\n2.加入购物车\n3.结算购物车\n4.返回登录页面")
    #设置一个goods字典存放商品信息
    goods = {"水杯": 10, "奶茶": 12, "充电器": 20, "鼠标": 30}
    #设置一个收shop_cart字典存放加入到购物车的商品信息
    shop_cart = {}
    while True:
        option = input("请输入你想要的操作序号：")
        if option == "1":
            print("商品列表如下：")
            for i in goods:
                print(f"{i},价格:{goods[i]}元")
        elif option == "2":
            number = input("请输入你想加入购物车的商品名称：")
            for i in shop_cart:
                #判断购物车中是否有同种商品
                if number == i:
                    #如果有同种商品，就将商品数量加1
                    shop_cart[number]["amount"] = shop_cart[number]["amount"] + 1
                    break
            else:
                #如果购物车无同种商品，商品数量置1
                shop_cart[number] = {"price": goods[number], "amount": 1}
            print("成功加入购物车！")
        elif option == "3":
            print("购物车商品如下：")
            print(shop_cart)
            tot_price = 0
            for i in shop_cart:
                #计算购物车中商品的总价格
                tot_price = tot_price + shop_cart[i]["price"]*shop_cart[i]["amount"]
            print(f"商品总价为：{tot_price}，您的余额为：{user_info[username]['tot_money']}元")
            if user_info[username]['tot_money'] < tot_price:
                print("余额不足！")
            else:
                user_info[username]['tot_money'] = user_info[username]['tot_money'] - tot_price
                print(f"支付成功！\n您的余额为：{user_info[username]['tot_money']}")
                #由于用户的余额改变，重新写入硬盘
                fp = open("user_info.json", "w")
                result_str = json.dumps(user_info)
                fp.write(result_str)
                fp.flush()
        elif option == "4":
            print("已返回登录页面！")
            login()
        else:
            print("请输入正确的序号！")

def shop_system():
    print("欢迎进入三乐购物系统！")
    while True:
        option = input("你可以输入：\n1.登录\n2.注册\n3.退出\n请输入序号：")
        if option == "1":
            login()
        elif option == "2":
            regist()
        else:
            print("已退出系统！")
            break
shop_system()
